package com.wfh.core.parser;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.wfh.ai.model.HtmlCodeResult;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @Title: HtmlCodeParser
 * @Author wangfenghuan
 * @Package com.wfh.aigenerator.core.parser
 * @Date 2025/7/29 21:57
 * @description: 解析 AI 返回的 HTML 内容，支持 JSON 格式和 Markdown 代码块两种形式
 */
public class HtmlCodeParser implements CodeParser<HtmlCodeResult> {

    /**
     * 匹配 Markdown 中的 ```html ... ``` 代码块（不区分大小写）
     */
    private static final Pattern HTML_CODE_PATTERN = Pattern.compile("```html\\s*\\n([\\s\\S]*?)```", Pattern.CASE_INSENSITIVE);

    /**
     * Jackson ObjectMapper 实例，用于解析 JSON 响应
     */
    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();

    /**
     * 解析 AI 返回的代码内容，提取出纯净的 HTML 字符串
     *
     * 支持两种格式：
     * 1. JSON 格式：{"html": "<!DOCTYPE html>..."}
     * 2. Markdown 代码块：```html\n<!DOCTYPE html>...\n```
     *
     * @param codeContent AI 返回的原始内容
     * @return HtmlCodeResult 包含提取出的 HTML 代码
     */
    @Override
    public HtmlCodeResult parseCode(String codeContent) {
        HtmlCodeResult result = new HtmlCodeResult();

        if (codeContent == null || codeContent.trim().isEmpty()) {
            result.setHtmlCode("");
            return result;
        }

        // Step 1: 尝试解析为 JSON（优先级最高）
        try {
            JsonNode rootNode = OBJECT_MAPPER.readTree(codeContent.trim());
            if (rootNode.has("html")) {
                String html = rootNode.get("html").asText();
                result.setHtmlCode(html.trim());
                return result;
            }
        } catch (JsonProcessingException e) {
            // 不是合法 JSON，继续尝试其他方式
        } catch (Exception e) {
            e.printStackTrace(); // 其他 JSON 错误（如编码问题）
        }

        // Step 2: 尝试提取 Markdown 代码块
        String extracted = extractHtmlCode(codeContent);
        if (extracted != null && !extracted.trim().isEmpty()) {
            result.setHtmlCode(extracted.trim());
            return result;
        }

        // Step 3: 都失败了，返回原始内容（可用于调试）
        result.setHtmlCode(codeContent.trim());
        return result;
    }

    /**
     * 从文本中提取 ```html ... ``` 代码块中的内容
     *
     * @param codeContent 输入的原始文本
     * @return 提取出的 HTML 代码，未找到则返回 null
     */
    private String extractHtmlCode(String codeContent) {
        Matcher matcher = HTML_CODE_PATTERN.matcher(codeContent);
        if (matcher.find()) {
            return matcher.group(1);
        }
        return null;
    }
}